package com.shujia.day08.ketang;

/*
    多态的好处：
        1、提高了程序的维护性(由继承保证)
        2、提高了程序的扩展性(由多态保证)

 */
class Animal{
    public void eat(){
        System.out.println("吃");
    }

    public void sleep(){
        System.out.println("睡");
    }
}

class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("🐕吃🥩");
    }

    @Override
    public void sleep() {
        System.out.println("🐕侧着睡");
    }
}

class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("🐱吃🐟");
    }

    @Override
    public void sleep() {
        System.out.println("🐱蜷着睡");
    }
}

class Sheep extends Animal{
    @Override
    public void eat() {
        System.out.println("🐏吃草");
    }

    @Override
    public void sleep() {
        System.out.println("🐏趴着睡");
    }
}

class Turtle extends Animal{
    @Override
    public void eat() {
        System.out.println("🐢吃🥩");
    }

    @Override
    public void sleep() {
        System.out.println("🐢缩着睡");
    }
}

class AnimalTool{
    public static void useAnimal(Animal animal){
        animal.eat();
        animal.sleep();
    }

//    public static void useCat(Cat cat){
//        cat.eat();
//        cat.sleep();
//    }
//
//    public static void useDog(Dog dog){
//        dog.eat();
//        dog.sleep();
//    }
//
//    public static void useSheep(Sheep sheep){
//        sheep.eat();
//        sheep.sleep();
//    }
}

public class DuoTaiDemo1 {
    public static void main(String[] args) {
        //现在我想养一只🐕
        Dog d1 = new Dog();
//        d1.eat();
//        d1.sleep();
//        useDog(d1);
//        AnimalTool.useDog(d1);
        AnimalTool.useAnimal(d1);
        Dog d2 = new Dog();
//        d2.eat();
//        d2.sleep();
//        useDog(d2);
//        AnimalTool.useDog(d2);
        AnimalTool.useAnimal(d2);

        //我现在不想养🐕，我想养一只🐱
        Cat c1 = new Cat();
//        c1.eat();
//        c1.sleep();
//        useCat(c1);
//        AnimalTool.useCat(c1);
        AnimalTool.useAnimal(c1);

        //随着我们养的动物种类越来越多，我们发现
        //1. 自定义动物的类越来越多【这是不可避免】
        //2. 当前类中的useXxx的方法越来越多，写在这里其实并不合适，因为这是一个测试类
        //测试类中主要涉及创建对象调用功能
        //我们可以将调用动物功能的方法放到一个动物工具类中
        //我想养一只🐏
        Sheep s1 = new Sheep();
//        AnimalTool.useSheep(s1);
        AnimalTool.useAnimal(s1);

        //工具类是不应该频繁被修改的类,也就是说,我们写好一个工具类后,即便我们有新的动物出现,也不需要修改工具类也可以使用
        //利用多态的扩展性来使用
        //我想养一只🐢
        Turtle t1 = new Turtle();
        AnimalTool.useAnimal(t1);


    }

//    public static void useCat(Cat cat){
//        cat.eat();
//        cat.sleep();
//    }
//
//    public static void useDog(Dog dog){
//        dog.eat();
//        dog.sleep();
//    }
}
